package sistemaDeLaCarrera;


import java.util.List;
import java.util.Vector;

import excepciones.MateriaNoFormaParteDelPlanDeEstudioException;
import alumno.*;

public class PlanDeEstudio {
	private int anio;	
	private int totalCreditos;
	private List<Materia> materias;
	private List<MateriaDePlanDeEstudio> materiasDePlanDeEstudio = new Vector<MateriaDePlanDeEstudio>();
	
	//CONSTRUCTORES
	public PlanDeEstudio(int anio, List<MateriaDePlanDeEstudio> materiaDePlanDeEstudio){
		this.materiasDePlanDeEstudio = materiaDePlanDeEstudio;
		this.totalCreditos = this.totalCreditos();
		this.anio = anio;
	}	
	
	//COMPORTAMIENTO
	/**
	 * sugiere las materias que un alumno puede cursar
	 * @param alumno de la carrera
	 */
	public List<Materia> sugerirMaterias(AlumnoEnCarrera alumno){
		List<Materia> materiasSugeridas = new Vector<Materia>();
		for(MateriaDePlanDeEstudio materia : this.getMateriasDePlanDeEstudio()){
			if(materia.puedeInscribirse(alumno))
				materiasSugeridas.add(materia.getMateria());
		}
		return materiasSugeridas;
	}
	
	/**
	 * Lista de las correlativas de una materia
	 * @param una materia
	 * @return sus correlativas 
	 * @throws MateriaNoFormaParteDelPlanDeEstudioException
	 */
	public List<Materia> obtenerCorrelativas(Materia materia) throws MateriaNoFormaParteDelPlanDeEstudioException{
		return this.buscarMateriaDePlanDeEstudio(materia).getMateriasCorrelativas();
	}
	
	/**
	 * Buscar una materia en el plan de estudio
	 * @param materia
	 * @return la materia en caso que lo encuentre
	 * @throws MateriaNoFormaParteDelPlanDeEstudioException
	 */
	public MateriaDePlanDeEstudio buscarMateriaDePlanDeEstudio(Materia materia) throws MateriaNoFormaParteDelPlanDeEstudioException{		
		for(MateriaDePlanDeEstudio m : this.getMateriasDePlanDeEstudio()){
			if(m.getMateria().equals(materia))
				return m;
		}
		throw new MateriaNoFormaParteDelPlanDeEstudioException();
	}
	
	/**
	 * Creditos totales de la materia
	 */
	public int totalCreditos() {
		int result = 0;
		for(MateriaDePlanDeEstudio m:this.materiasDePlanDeEstudio){
			result += m.getMateria().getCreditos();
		}
		
		return result;
	}
	
	/**
	 * Todas las materias que tiene el plan de estudio
	 * @return lista de materias
	 */
	public List<Materia> susMaterias(){
		List<Materia> materia = new Vector<Materia>();
		for(MateriaDePlanDeEstudio m : this.materiasDePlanDeEstudio){
			materia.add(m.getMateria());
		}
		return materia;
	}
	
	
	//getter and setter


	public void setYear(int year) {
		this.anio = year;
	}


	public int getYear() {
		return anio;
	}

	public void setMateriasDePlanDeEstudio(List<MateriaDePlanDeEstudio> materiasDePlanDeEstudio) {
		this.materiasDePlanDeEstudio = materiasDePlanDeEstudio;
	}

	public List<MateriaDePlanDeEstudio> getMateriasDePlanDeEstudio() {
		return materiasDePlanDeEstudio;
	}


	public int getAnio() {
		return anio;
	}

	public void setAnio(int anio) {
		this.anio = anio;
	}

	public int getTotalCreditos() {
		return totalCreditos;
	}

	public void setTotalCreditos(int totalCreditos) {
		this.totalCreditos = totalCreditos;
	}

	public List<Materia> getMaterias() {
		return materias;
	}

	public void setMaterias(List<Materia> materias) {
		this.materias = materias;
	}

}
